package dao

import (
	models "yuanaiproblem/dao/model" // 导入题目相关模型
	"yuanaiproblem/migrations/db"    // 导入数据库连接
)

// CreateQuestion 创建题目
// 入参：题目指针
// 返回：创建结果
func CreateQuestion(question *models.Question) error {
	return db.DB.Create(question).Error
}

// GetQuestionByID 查询题目
// 入参：按ID查未删除的题目
// 返回：题目或错误
func GetQuestionByID(id uint) (*models.Question, error) {
	var question models.Question // 存储查询到的题目
	result := db.DB.First(&question, id)
	if result.Error != nil {
		return nil, result.Error // 查询失败返回错误
	}
	return &question, nil // 返回题目指针
}

// GetQuestionByIDWithDeleted 查询包含已删除的题目
// 查所有状态的题目（包括已删除）
func GetQuestionByIDWithDeleted(id uint) (*models.Question, error) {
	var question models.Question // 存储查询到的题目
	// Unscoped()取消软删除过滤
	result := db.DB.Unscoped().First(&question, id)
	if result.Error != nil {
		return nil, result.Error // 查询失败返回错误
	}
	return &question, nil // 返回题目指针
}

// CountQuestionReferences 统计题目被试卷引用次数
// 入参题目ID，返回引用次数和错误
func CountQuestionReferences(questionID uint) (int64, error) {
	var count int64 // 存储引用次数
	// 统计关联表中该题目的引用记录
	err := db.DB.Model(&models.PaperQuestion{}).
		Where("question_id = ?", questionID).
		Count(&count).Error
	return count, err
}

// DeleteQuestion 软删除题目
// 入参题目指针，执行软删除
func DeleteQuestion(question *models.Question) error {
	return db.DB.Delete(question).Error
}

// UpdateQuestion 更新题目
// 按字段更新题目信息，入参题目指针和更新字段映射
func UpdateQuestion(question *models.Question, updates map[string]interface{}) error {
	return db.DB.Model(question).Updates(updates).Error
}

// GetUserQuestions 获取用户题目列表
// 分页查询用户创建的未删除题目，按更新时间倒序
func GetUserQuestions(userID int32, page, pageSize int) ([]models.Question, int64, error) {
	// 构建查询条件：用户ID匹配且未删除
	query := db.DB.Model(&models.Question{}).
		Where("user_id = ?", userID).
		Where("deleted_at IS NULL")
	// 总记录数
	var total int64
	if err := query.Count(&total).Error; err != nil {
		return nil, 0, err
	}
	// 计算分页偏移量
	offset := (page - 1) * pageSize
	var questions []models.Question // 存储查询到的题目
	// 执行分页查询，按更新时间倒序
	if err := query.
		Order("updated_at DESC").
		Offset(offset).
		Limit(pageSize).
		Find(&questions).Error; err != nil {
		return nil, 0, err
	}
	return questions, total, nil
}

// GetUserQuestions 获取用户题目列表(包括已删除和未删除)
// 分页查询用户创建的未删除题目，按更新时间倒序
func GetUserAllQuestions(userID int32, page, pageSize int) ([]models.Question, int64, error) {
	// 构建查询条件：用户ID匹配且未删除
	query := db.DB.Model(&models.Question{}).Where("user_id = ?", userID)
	// 总记录数
	var total int64
	if err := query.Count(&total).Error; err != nil {
		return nil, 0, err
	}
	// 计算分页偏移量
	offset := (page - 1) * pageSize
	var questions []models.Question // 存储查询到的题目
	// 执行分页查询，按更新时间倒序
	if err := query.
		Order("updated_at DESC").
		Offset(offset).
		Limit(pageSize).
		Find(&questions).Error; err != nil {
		return nil, 0, err
	}
	return questions, total, nil
}
